﻿
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "lib/time_period.h"
#include "lib/personal.h"
 #include <hiredis/hiredis.h>
#include <string.h>

int main() {
    printf("程序开始运行...\n");
    fflush(stdout);
    
    // 获取当前系统时间并判定其时间段
    time_t now = time(NULL);
    if (now == -1) {
        printf("获取系统时间失败\n");
        return 1;
    }
    
    struct tm *local = localtime(&now);
    if (local == NULL) {
        printf("转换本地时间失败\n");
        return 1;
    }
    
    int hour = local->tm_hour;
    int min = local->tm_min;
    
    // INSERT_YOUR_CODE
    printf("hour = %d, min = %d\n", hour, min);
    
    printf("当前时间: %02d:%02d\n", hour, min);
    fflush(stdout);
    
    PeriodType period = get_current_period(hour, min);
    
    // 时间
    printf("period = %d\n", period);
    printf("当前系统时间 %02d:%02d 处于 %s\n", 
            hour, min, period_type_to_string(period));
    fflush(stdout);


    // INSERT_YOUR_CODE
    int arr[4];
    arr[0] = 400;
    arr[1] = 656;
    arr[2] = 912;
    arr[3] = 1168;

    for(int i = 0; i < 4; i++) {

        //车载重量
        int weight = 100;  // TODO获取车载重量

        //按照单个人 60 来计算，计算人数
        int count = weight/ 60;

        //室外新风温度
        int outsideTemp = 32;

        DensityLevel level = (int) get_density_level(count);

        int ttl_peropd = 30; //TODO 持续时间
        int ttl_level = 30   //TODO 持续时间

        // 早晚高峰期 && 高密度模型 以上模型
        if((period == 1) && (level >= 5)) {
            
            if(ttl_peropd > 30 && ttl_level > 30) {
                 //工况2
                if(outsideTemp > 32) {
                    //TODO 下发指令，目标温度 16
                    //TODO 下发指令  新风发开度 100%
                } else {
                     //工况1
                    //TODO 下发指令，目标温度 17
                    //TODO 下发指令  新风发开度 100%
                }
            }
        }

        // 小高峰期
        if(period == 2  && (level == 4)) {
            if(ttl_peropd > 30 && ttl_level > 30) {
                //工况4
                if(outsideTemp > 32) {
                    //TODO 下发指令，目标温度 19
                    //TODO 下发指令  新风发开度 75%
                } else {

                    //工况3
                    //TODO 下发指令，目标温度 20
                    //TODO 下发指令  新风发开度 75%
                }
            }
        }

        // 平稳期
        if(period == 3 && (level == 3)) {
            //持续时间长
            if(ttl_peropd > 30 && ttl_level > 30) {
                //工况5
                if(outsideTemp > 32) {
                    //TODO 下发指令，目标温度 22
                    //TODO 下发指令  新风发开度 50%
                }
            }
        }

        // 平稳期
        if(period == 4 && (level == 2)) {
            //持续时间长
            if(ttl_peropd > 30 && ttl_level > 30) {
                //工况6
            
                //TODO 下发指令，目标温度 23.5
                //TODO 下发指令  新风发开度 25%
                }
            }
        }
    }


    // 连接 Rediscont
    printf("尝试连接 Redis...\n");
    fflush(stdout);
    
    // 使用 hiredis 的异步 API 连接 Redis（不使用命令行模式）
    // 这里演示 hiredis async 连接方式，但仍需事件循环库（如libevent/libev），
    // 但我们可以用 hiredis 的低级 socket 方式手动实现简单连接和命令发送。

    // INSERT_YOUR_CODE
    // 使用 hiredis 进行 Redis 的读写
    // 假设已包含 #include <hiredis/hiredis.h>，此处直接使用

    // 连接到本地 Redis 服务器
    redisContext *c = redisConnect("127.0.0.1", 6379);
    if (c == NULL || c->err) {
        if (c) {
            printf("Redis 连接错误: %s\n", c->errstr);
            redisFree(c);
        } else {
            printf("无法分配 Redis 上下文\n");
        }
        return 1;
    }
    printf("Redis 连接成功！\n");
    fflush(stdout);

    // 写入一个键值对
    const char *key = "test_key";
    const char *value = "hello_redis";
    redisReply *reply = (redisReply *)redisCommand(c, "SET %s %s", key, value);
    if (reply == NULL) {
        printf("Redis SET 命令失败\n");
        redisFree(c);
        return 1;
    }
    printf("SET %s %s: %s\n", key, value, reply->str ? reply->str : "(无返回)");
    freeReplyObject(reply);

    // 读取该键
    reply = (redisReply *)redisCommand(c, "GET %s", key);
    if (reply == NULL) {
        printf("Redis GET 命令失败\n");
        redisFree(c);
        return 1;
    }
    if (reply->type == REDIS_REPLY_STRING) {
        printf("GET %s: %s\n", key, reply->str);
    } else {
        printf("GET %s: (无值)\n", key);
    }
    freeReplyObject(reply);

    // 关闭 Redis 连接
    redisFree(c);
    printf("程序执行完成\n");
    fflush(stdout);
    return 0;
}

